package tec;

import java.util.LinkedList;
import java.util.Iterator;

class Autobus implements Bus, Transport {

    //La classe Autobus implémente la classe JaugeNaturel
    private int nb_place;
    private JaugeNaturel debout;
    private JaugeNaturel assis;
    private int numeroArret;
    
    private LinkedList<Passager> passagers;

    //private Passager[] passagers;
    
    public Autobus (int nbPlaceAssise, int nbPlaceDebout){
	
	debout = new JaugeNaturel(0,nbPlaceDebout,0);
        assis = new JaugeNaturel(0,nbPlaceAssise,0);
	nb_place = nbPlaceAssise + nbPlaceDebout;
	passagers = new LinkedList<Passager>();
	//  passagers = new Passager[nbPlaceAssise + nbPlaceDebout + 1];
	
	
    }
    
    public boolean aPlaceAssise() {
	
	return assis.estVert();
    }
    
    public boolean aPlaceDebout() {
	return debout.estVert();
    }
    
    
    public void demanderPlaceAssise(Passager p)
    {
        if (aPlaceAssise())
            {
		passagers.add(p);
		assis.incrementer();
                p.accepterPlaceAssise();
            }
    }
   
    public void demanderPlaceDebout(Passager p)
    {
        if(aPlaceDebout())
            {
		passagers.add(p);
                debout.incrementer();
                p.accepterPlaceDebout();
            }
    }

    private void nouvelleSortie(Iterator<Passager> place, Passager aEnlever)
    {
	place.remove();

        if ( aEnlever.estAssis())
            {
                assis.decrementer();
            }
        else if (aEnlever.estDebout())
            {
                debout.decrementer();
            }
	
        aEnlever.accepterSortie();
    }

    public void demanderSortie(Passager p)
    {
	passagers.remove(p);

        if ( p.estAssis() )
            {
                assis.decrementer();
            }
        else if (p.estDebout())
            {
                debout.decrementer();
            }
	
        p.accepterSortie();
    }
    
    public void demanderChangerEnAssis(Passager p) {
	if(!p.estAssis()){
	    if (aPlaceAssise()) {
		assis.incrementer();
		debout.decrementer();
		p.accepterPlaceAssise();
	    }
	}else{
	    throw new java.lang.IllegalStateException();
	}
    }
    
    public void demanderChangerEnDebout(Passager p) {
	if(!p.estDebout()){
	    if (aPlaceDebout()) {
		assis.decrementer();
		debout.incrementer();
		p.accepterPlaceDebout();
	    }
	}else{
	    throw new java.lang.IllegalStateException();
	}
    }
        
    public void allerArretSuivant() throws TecInvalidException { 
	
	numeroArret ++;

	final Iterator<Passager> it = passagers.iterator();
	Bus bus2 = new Bus ()
	{
	    public void demanderSortie(Passager p)
	    {
		nouvelleSortie(it,p);
	    }
	    public boolean aPlaceAssise(){return true;}
	    public boolean aPlaceDebout(){return true;}
	    
	    public void demanderPlaceAssise(Passager p){}
	    public void demanderPlaceDebout(Passager p){}
	    
	    public void demanderChangerEnDebout(Passager p){}
	    public void demanderChangerEnAssis(Passager p){}
	    
	    public void allerArretSuivant() throws TecInvalidException{}
	    
	    };
	
	while(it.hasNext())
	    {
		Passager p = it.next();
		try{
		    p.nouvelArret(bus2,this.numeroArret);
		}catch(java.lang.IllegalStateException e){
		    throw new TecInvalidException(e);
		}
	    }
        
    }


    @Override
	public String toString() {
	return "[arret:" + this.numeroArret + ", assis:" + this.assis + ", debout:" + this.debout + "]";
    }

}		
